package com.yc.jpyy.terminator.controller;

import java.io.File;
import java.io.FileOutputStream;
import java.io.IOException;
import java.io.InputStream;
import java.text.SimpleDateFormat;
import java.util.Date;
import java.util.List;
import javax.servlet.ServletException;
import javax.servlet.http.HttpServletRequest;
import org.apache.tomcat.util.http.fileupload.FileItem;
import org.apache.tomcat.util.http.fileupload.disk.DiskFileItemFactory;
import org.apache.tomcat.util.http.fileupload.servlet.ServletFileUpload;
import org.apache.tomcat.util.http.fileupload.servlet.ServletRequestContext;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
import org.springframework.beans.factory.annotation.Autowired;
import org.springframework.stereotype.Controller;
import org.springframework.web.bind.annotation.RequestMapping;
import org.springframework.web.bind.annotation.RequestMethod;
import org.springframework.web.bind.annotation.ResponseBody;
import com.yc.jpyy.base.bean.RestResponse;
import com.yc.jpyy.base.config.Config;
import com.yc.jpyy.base.controller.BaseController;
import com.yc.jpyy.mobile.dao.BizDao;
import com.yc.jpyy.mobile.service.BizService;

@Controller
@RequestMapping(value = "/terminator")
public class UploadFileController extends BaseController {

	@Autowired
	private BizService bizService;
	private static Logger logger = LoggerFactory
			.getLogger(UploadFileController.class);
	@Autowired
	private BizDao bizDao;


	 /** 
     * 文件上传 
     * @param request 
     * @param response 
     * @return 
     * @throws ServletException 
     * @throws IOException 
     */ 
	@SuppressWarnings("finally")
    @RequestMapping(value = "/fileUpload", method =
			RequestMethod.POST, produces = "application/json; charset=utf-8")  
    public @ResponseBody String fileUpload(HttpServletRequest request) throws ServletException, IOException{  
    	RestResponse response = new RestResponse();
    	SimpleDateFormat sdf = new SimpleDateFormat("yyyyMMdd-HHmmss");  
    	String rootDir = request.getServletContext().getRealPath("/");
    	rootDir.replaceAll( "\\\\ ","/");
    	//得到上传文件的保存目录，将上传的文件存放于WEB-INF目录下，不允许外界直接访问，保证上传文件的安全  
        String savePath = rootDir+Config.getFileLog();  
        File file = new File(savePath);  
        //判断上传文件的保存目录是否存在  
        if (!file.exists() && !file.isDirectory()) {  
            System.out.println(savePath+"目录不存在，需要创建");  
            //创建目录  
            file.mkdir();  
        }  
        //消息提示  
        String message = "";  
        try{  
            //使用Apache文件上传组件处理文件上传步骤：  
            //1、创建一个DiskFileItemFactory工厂  
            DiskFileItemFactory factory = new DiskFileItemFactory();  
            //2、创建一个文件上传解析器  
            ServletFileUpload upload = new ServletFileUpload(factory);  
            //解决上传文件名的中文乱码  
            upload.setHeaderEncoding("UTF-8");   
            //3、判断提交上来的数据是否是上传表单的数据  
            if(!ServletFileUpload.isMultipartContent(request)){  
                //按照传统方式获取数据  
                System.out.println("没有文件上传");  
            }  
           //4、使用ServletFileUpload解析器解析上传数据，解析结果返回的是一个List<FileItem>集合，每一个FileItem对应一个Form表单的输入项  
           List<FileItem> list = upload.parseRequest(new ServletRequestContext(request));  
           for(FileItem item : list){  
               //如果fileitem中封装的是普通输入项的数据  
               if(item.isFormField()){  
                   String name = item.getFieldName();  
                   //解决普通输入项的数据的中文乱码问题  
                  String value = item.getString("UTF-8");  
                  //value = new String(value.getBytes("iso8859-1"),"UTF-8");  
                  System.out.println(name + "=" + value);  
              }else{//如果fileitem中封装的是上传文件  
                   //得到上传的文件名称，  
                   String filename = item.getName();  
                   System.out.println(filename);  
                   if(filename==null || filename.trim().equals("")){  
                       continue;  
                   }  
                  //注意：不同的浏览器提交的文件名是不一样的，有些浏览器提交上来的文件名是带有路径的，如：  c:\a\b\1.txt，而有些只是单纯的文件名，如：1.txt  
                  //处理获取到的上传文件的文件名的路径部分，只保留文件名部分  
                  filename = filename.substring(filename.lastIndexOf("\\")+1);  
                  String filenames []=filename.split("\\.");
                  filename=filenames[0]+sdf.format(new Date())+"."+filenames[1];
                  //获取item中的上传文件的输入流  
                  InputStream in = item.getInputStream();  
                   //创建一个文件输出流  
                   FileOutputStream out = new FileOutputStream(savePath + "\\" + filename);  
                   //创建一个缓冲区  
                   byte buffer[] = new byte[1024];  
                   //判断输入流中的数据是否已经读完的标识  
                  int len = 0;  
                  //循环将输入流读入到缓冲区当中，(len=in.read(buffer))>0就表示in里面还有数据  
                  while((len=in.read(buffer))>0){  
                      //使用FileOutputStream输出流将缓冲区的数据写入到指定的目录(savePath + "\\" + filename)当中  
                      out.write(buffer, 0, len);  
                  }  
                   //关闭输入流  
                   in.close();  
                   //关闭输出流  
                   out.close();  
                  //删除处理文件上传时生成的临时文件  
                  item.delete();  
                  message = "文件上传成功！"; 
                  response.setErrorcode(0);
       		      response.setMessage(message);
              }  
          }  
       }catch (Exception e) {  
    	   message = "文件上传失败！"; 
    	   logger.info("上传异常" + e.toString());
           response.setErrorcode(1);
		   response.setMessage(message);
             
       }finally {   
        return response.toJSON();
       }
    }  
 
}
